{"id":46915818,"url":"https://github.com/deferpanic/goweave","last_synced_at":"2026-03-11T02:31:12.774Z","repository":{"id":32169974,"uuid":"35743238","full_name":"deferpanic/goweave","owner":"deferpanic","description":"Aspect Oriented Programming for Go","archived":false,"fork":false,"pushed_at":"2020-01-09T15:22:10.000Z","size":60,"stargazers_count":225,"open_issues_count":3,"forks_count":9,"subscribers_count":22,"default_branch":"master","last_synced_at":"2024-06-20T19:18:23.166Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deferpanic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-16T22:52:32.000Z","updated_at":"2024-02-10T18:13:55.000Z","dependencies_parsed_at":"2022-09-11T05:12:46.020Z","dependency_job_id":null,"html_url":"https://github.com/deferpanic/goweave","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/deferpanic/goweave","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deferpanic%2Fgoweave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deferpanic%2Fgoweave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deferpanic%2Fgoweave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deferpanic%2Fgoweave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deferpanic","download_url":"https://codeload.github.com/deferpanic/goweave/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deferpanic%2Fgoweave/sbom","scorecard":{"id":332370,"data":{"date":"2025-08-11","repo":{"name":"github.com/deferpanic/goweave","commit":"e45cd4aa1fc9fc7a793c013468b2281975403703"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Code-Review","score":1,"reason":"Found 3/24 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T03:55:23.852Z","repository_id":32169974,"created_at":"2025-08-18T03:55:23.852Z","updated_at":"2025-08-18T03:55:23.852Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30367814,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-11T02:31:12.186Z","updated_at":"2026-03-11T02:31:12.758Z","avatar_url":"https://github.com/deferpanic.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"goweave\n  Aspect Oriented Programming for Go\n\n[![wercker status](https://app.wercker.com/status/7d7912cec649bc9763736051f64da3fa/s/master \"wercker status\")](https://app.wercker.com/project/bykey/7d7912cec649bc9763736051f64da3fa)\n\n[![GoDoc](https://godoc.org/github.com/deferpanic/goweave?status.svg)](https://godoc.org/github.com/deferpanic/goweave)\n\n\n![Weave](http://i.imgur.com/JUUgIuv.png)\n\n### WARNING - Major Hackage\n\n  This really isn't meant to be used by anyone yet - definitely not in a\nproduction environment - you have been warned!\n\n  Many 'design decisions' were not decisions at all - they were simply\nthe \"most simplest thing that could work\". Lots of work left to do.\n\n### TOC\n\n  [What is AOP](https://github.com/deferpanic/goweave#what_is_aop)\n\n  [Why](https://github.com/deferpanic/goweave#why)\n\n  [Usage](https://github.com/deferpanic/goweave#usage)\n\n  [Examples](https://github.com/deferpanic/loom#examples)\n\n  [Loom](https://github.com/deferpanic/loom)\n\n  [FAQ](https://github.com/deferpanic/goweave#faq)\n\n  [Info](https://github.com/deferpanic/goweave#info)\n\n  [Reserved Keywords](https://github.com/deferpanic/goweave#reserved-keywords)\n\n  [Differences](https://github.com/deferpanic/goweave#differences)\n\n  [Performance](https://github.com/deferpanic/goweave#performance)\n\n  [Tests](https://github.com/deferpanic/goweave#tests)\n\n  [Help](https://github.com/deferpanic/goweave#help)\n\n  [Todo](https://github.com/deferpanic/goweave#todo)\n\n  [Roadmap](https://github.com/deferpanic/goweave#roadmap)\n\n## What is AOP !??\n\n  [Aspect oriented programming](http://docs.jboss.org/aop/1.1/aspect-framework/userguide/en/html/what.html)\n\n  In short - this is a pre-processor that generates code defined by a\ngoweave specification file - it's not a proper grammar yet although it\nprobably should be.\n\n### Why!??!\n\n\u003e \"... which is our fulltime job, write a program to write a program\"\n\u003e rob pike\n\nThe critics yell red in the face - \"We came to go to get away from enterprise java!!\nWhat the hell is the matter with you!?\"\n\nI agree this concept can and has been abused in the past.\n\nHowever, I'm definitely not a code purist - to me coding is a tool first and\nforemost.\n\nI simply wanted an easy way to attach common bits of code to large\nexisting codebases without having to hack it in each time to each\ndifferent codebase. I also needed the ability to do this on large\nprojects without modifying the source.\n\nSure I could write method wrappers, I could change code, etc. but I\ndon't want to be constantly writing/re-writing/re-moving/inserting tons\nof code just to check things out.\n\nAutomate all the things. For me, this is simply a powertool for deep introspection of go programs.\n\nThat is the rationale behind this.\n\n### Existing Tools:\n\n#### [go fmt](https://golang.org/pkg/fmt/)\nThis is actually used for around advice currently. It allows you to wrap\nmethods. Having said that - we wish to do more proper around advice than\nsimply re-writing the function declaration.\n\n  ex:\n\n  ```go\n  gofmt -r 'bytes.Compare(a, b) == 0 -\u003e bytes.Equal(a, b)'\n  ```\n\n#### [go fix](https://golang.org/cmd/fix/):\nThis is one hell of an awesome tool. I just think it's a little\ntoo low-level for what we are wanting to do. Remember - one of the\nsolutions of this tool is to make things as trivial as possible to\ninsert new functionality.\n\n#### [go cover](https://godoc.org/golang.org/x/tools/cmd/cover):\nThis is used to provide code coverage and has similar properties\nto what we want.\n\n#### [go generate](http://blog.golang.org/generate):\nWe are generating code but we are looking for more extensive code\ngeneration.\n\n### Usage:\n\nWhere you might use\n\n```go\n  go build\n```\n\nsimply replace with\n\n```go\n  goweave\n```\n\nNote: depending on how you build your go this may or may not work -\npatches/pulls to make this more generic for everyone are definitely\nwelcome.\n\n### Use Cases\n  * error detection \u0026\u0026 correction\n    (ex: force logging of errors on any methods with this declaration)\n\n  * data validation\n    (ex: notate that this data was invalid but allow it to continue)\n\n  * i18n\n    (ex: translate this to esperanto if you can't detect the language)\n\n  * security\n    (ex: authenticate this user in each http request)\n\n  * caching\n    (ex: cache these variables when exposed in a http request)\n\n  * logging\n    (ex: log when this group of users accesses these methods)\n\n  * monitoring\n    (ex: ensure that if this channel closes we always alert joebob)\n\n  * metrics\n    (ex: cnt the number of times this function is called)\n\n  * tracing\n    (ex: print out the value of this variable in a pkg)\n\n  * dealing with legacy code\n    (ex: overriding a method/API w/minimum of work)\n\n  * static validation\n    (ex: force closing a file if we detect that it hasn't been closed)\n\n### Grammar:\n\n  The aspect 'grammar' if you can call it that is a total piece right\nnow. It is a little bit of go, a little of json, etc. It is most definitely\nnot going to stay the same - it will be improved in the future.\n\n  I apologize for giving you the forks to stab your collective eyes out.\n\n  I think a good goal to have is to make it as proper go as possible and\nthen extend it maybe through comments.\n\n  Suggestions/pull requests/discussions more than welcome!\n\n### Definitions:\n\n  I probably have not defined certain things properly here - open a pull\nrequest if you find something off.\n\n### Join Points\n\n  Places in your code you can apply behavior.\n\n### Aspects:\n\n  A .weave file that contains our behavior.\n\n  Right now we support multiple .weave projects for a project and they\nwill apply advice recursively over a project.\n\n  The programming theory department says that aspects are common features\nthat you use everywhere that don't really have anything at all to do with\nyour domain logic. Logging is a canonical example - most everything you\nlog does not really have anything to do with all the other stuff you\nlog.\n\n  Similarly if you had a http controller that whenever you got a request\nyou would update a metric counter for that controller but you do this on\neach api controller - that really has nothing at all to do with the\ncontroller logic itself. The metric might simply be another aspect that\nis common everywhere.\n\n  Once again someone might point out why don't you just make a method\nand then wrap each call? The point here is that 1) we don't want to\nmodify code, 2) we might not *know* all the places that happens and\ncould easily leave something out, 3) we are eternally lazy and would\nrather the computer do this for us.\n\n### PointCut:\n\n  An expression that details where to apply behavior.\n\n  Pointcuts in other languages such as java can commonly use annotations\n    -- we currently don't support this as we want to be un-obtrusive as possible\n    -- that is - we don't want to modify go source\n\n  We support {call, execute, within} pointcut primitives right now:\n  Also we are hacking in local/global get/sets and declarations.\n\n__call__:\n\n    These happen before, after or wrap around calling a method. The code is outside of the function.\n\n__execute__:\n\n    These happen before or after executing a method. The code is put inside the method.\n\n__within__:\n\n    These happen for *every* statement within a function body declaration.\n\n----------\n\n__get__:\n\n  These fire when a local/global variable has a get operation.\n\n__set__:\n\n  These fire when a local/global variable has a set operation.\n\n__declaration__:\n\n  This fires when a variable is declared.\n\n\n  All pointcuts are currently defined only on functions. Struct field\nmembers are definitely a future feature we could support although go\ngenerate might do this acceptably already.\n\n  Note: this 'grammar' if you can call it is nowhere close to 'ok' - expect it to\nchange \"heavily\".\n\n#### explicit method name\n```go\n  call(blah())\n```\n\n```go\n  execute(blah())\n```\n\n#### partial match method name - TODO\n\n```go\n  call(b.*)\n```\n\n```go\n  execute(b.*)\n```\n\n#### function declaration w/wildcard arguments\n```go\n  call(http.HandleFunc(d, s))\n```\n\n#### wildcard function name w/explicit arguments\n      execute((w http.ResponseWriter, r *http.Request))\n\n#### doesn't work yet - TODO\n\nsub-pkg \u0026\u0026 method name\n```go\n  execute(pkg/blah())\n```\n\nsub-pkg \u0026\u0026 struct \u0026\u0026 method-name\n```go\n  execute(pkg/struct.b())\n```\n\n#### struct \u0026\u0026 method name - TODO\n```go\n  execute(struct.b())\n```\n\n### Advice:\n\nBehavior to apply:\n\n  * before\n  * after\n  * around\n\nAround advice currently only works with call pointcuts.\n\nWe currently support the following advice:\n\n#### call examples:\n\n```go\n  some.stuff()\n```\n\nCode will be executed {before, around, after} this call.\n\n__call before:__\n```go\n  fmt.Println(\"before\")\n  some.stuff()\n```\n\n__call after:__\n```go\n  some.stuff()\n  fmt.Println(\"before\")\n```\n\n__call around:__\n```\n  somewrapper(some.stuff())\n```\n\n#### execute examples:\n\n```go\n  func stuff() {\n    fmt.Println(\"stuff\")\n  }\n```\n\n__execute before:__\n```go\n  func stuff() {\n    fmt.Println(\"before\")\n    fmt.Println(\"stuff\")\n  }\n```\n\n__execute after:__\n```go\n  func stuff() {\n    fmt.Println(\"stuff\")\n    fmt.Println(\"after\")\n  }\n```\n\n#### within examples:\n\n```go\n  func blah() {\n    slowCall()\n    fastCall()\n  }\n```\n\n__within before:__\n```go\n  func blah() {\n    beforeEach()\n    slowCall()\n    beforeEach()\n    fastcall()\n  }\n```\n\n### Goals\n\n* FAST - obviously there will always be greater overhead than just\n  running go build but we don't want this to be obscene - right now it's\n  a little obscene\n\n* CORRECT - it goes w/out saying this is highly important to be as\n  correct as possible w/our code generation\n\n* NO CODE MODIFICATIONS - my main use cases involve *not* modifying code\n  so that is why we initially did not support annotations - I'm not\n  opposed to adding these but that's not my intended goal\n\n* create tooling around AO development for go\n\n* maybe move towards compiler extension?\n\n### FAQ\n\n#### Why not do everything via the AST?\n  We are moving all the regexen to AST modifications. This started out as a\nPOC and I wanted functionality first - correctness comes after.\n\n#### Why not modify the AST instead of re-writing the source each time an\n  aspect is applied?\n  We also want to do this - once again - it was a POC and\ncorrectness/speed comes later. Pull requests welcome.\n\n#### What about IR generation?\n\n#### What about aspects on binary/closed-source?\n  This is arguably one of the bigger benefits of AOP (at least for our\npurposes) and it's definitely something we intend to support/code for in\nthe future.\n\n  That's a long ways away but not off the radar/roadmap.\n\n#### Why wouldn't you just code this into your source?\n  A couple of reasons.\n\n  1) If you are going to do something like development tracing (eg:\nsprinkle some fmt.Println everywhere) you don't want that in your\nproduction code. It's much better to apply it when necessary in your\nbinary, fix the problem and go - there is no need to code it in, then\nhack it back out (and potentially miss some). It's *much* cleaner this\nway and it's *much* faster.\n\n  2) The original reason we did this was over at DeferPanic we had many\nrequests from people wanting to use our code to automatically insert\ncode in. For existing codebases this was a lot of work. After we made a\n[tool](https://github.com/deferpanic/deprehend) that did this code\ngeneration we had requests to make it non-obtrusive - that is - they\ndidn't want the code inside their codebase - just available to them at\nruntime.\n\n  3) I'd like the ability to turn on/off the behavior at will *and* not\nhave to re-code it for every project. I think this is where this really\nshines.\n\n#### Are you all insane? This is go heresey!! Burn them at the stake!\n\n  :) We are practioners of the \"get-shit-done\" philosophy. Whether this\nis considered good or bad practice is not quite a concern for our\nusecases.\n\n  We only care about - how fast can I get this done?\n\n  Our use cases usually entail us having to jump into brand new large\ncodebases and we want to send 'tracer bullets' out very very fast. This\nstyle of programming allows us to do that.\n\n### Info\n\n* builds are currently made in ~/go/src/_weave - I don't think this is\n  ideal so am open to further suggestions\n\n* builds are *really* *really* slow right now - there is a lot of file\n  I/O we shouldn't be doing - many files we read/write multiple times -\nthis goes hand in hand w/the text processing - most of this should just\nbe moved to the AST processing - plenty of cruft laying around as well\nthat needs to be refactored\n\n### Reserved Keywords\n\n  Right now the only time you'll run into reserved keywords are in the\nexperimental 'within' and 'get'/'set' advice section although there is an intention to\nsupport a set of keywords that one can use in their aspects.\n\n  * mName\n    If you use 'mName' within your within advice it will translate to a\nstring representation of the joinpoint found by your within pointcut.\n\n  * mAvars\n    this is a list of abstract variables used within get/set advice\n\n  We'd appreciate help from the community formulating a more formal\napproach for this. Namespacing, the set of keywords supported, etc.\n\n### Differences\n\n  There are many differences between this and other AOP implementations\nsuch as AspectJ.\n\n  Firstly, since go has no vm executing bytecode so we don't weave at the bytecode\nlevel. Currently we weave at source code level at build time.\n\n  Secondly, we don't currently support annotations. I'm open to this in\nthe future but it wasn't a primary usecase for me so I didn't add them.\n\n### Performance\n\n  Is pretty bad right now. Lots of needless reading/writing of files. Part of\nthis was cause it started out with regex/line parsing and slowly moved\ntowards AST manipulating.\n\n  Once most of the file rewriting is moved towards AST modification the\nperformance should imrpove dramatically but right now it really sucks\nand is going to make you cry.\n\n  Lots of further work in this area to do. If you want to help - pulls\nare definitely welcome.\n\n  For a point of reference - on a well known web application it takes 12\nseconds to build versus 1.59 seconds with just go build.\n\n  We'd very much like help from the community in refactoring some of\nthese performance problems.\n\n### Tests\n\n  The tests are very brittle right now and are more functional than unit\nbased. Lots of work here to do. Once most of the file reading/writing\nstuff is replaced with AST replacement transformations the tests should be much more specific not to mention must faster.\n\n  I really don't like the fact that the tests are the way they are right\nnow but just need to ensure certain things work until we refactor it.\n\n  We would appreciate any help from the community in refactoring the\ncode so the tests aren't big blocks of text - no need for that.\n\n### What You Should Know Before Using\n\nThis is *alpha* software - at best. It's more of an idea right now than anything\nelse.\n\n* Expect the \"grammars\" {aspects, pointcuts} to change.\n\n* This is currently *much* slower compared to native go build. Expect that to\n  change but right now it's slow.\n\n* Expect the build system to change soon. It's slow and crap. Getting\n  the latency down is very much an immediate goal.\n\n* This *might* eat your cat - watch out.\n\n### TODO\n#### a.k.a. - Known Suckiness\n\n* add ability to add global function advice to pkg\n\n* make everything use ast - no raw txt\n\n* multi-pass parsing\n  - this should ideally be a single pass\n  - most of the regex/line scanning should be converted to AST node\n    replacement\n\n* add support for matching function declaration w/returns\n\n* import vendoring/re-writing\n  -- very open to different ways of approaching this - it kinda sucks\nright now\n\n* better error handling\n  - can do bail outs if parser doesn't emit correctly\n\n* matching function declarations\n  - with arguments\n  - with return arguments\n  - partial function matching\n\n* scope\n  - for the regex \u0026\u0026 line-editing stuff this is completely naive - pulls\n    pls\n\n* annotations??\n\n* Faster\n\n* Better Test coverage\n\n### Pointcut Todo\n  * create a more proper language\n\n  * match against method receivers\n  * match against return arguments\n  * match stdlib\n  * match 3rd pkgs\n\n### Aspect Todo\n\n  * ability to add functions to global namespace\n    -- maybe just need some tests here\n\n### Help\n\n  Want to help? Ideas for helping out:\n\n  * test coverage\n\n  * benchmark coverage\n\n  * documentation\n\n  * sample aspects - aspects [should be shared on the loom](https://github.com/deferpanic/loom)\n    - no need to re-invent the wheel\n\n  Need helping visualizing what you are looking at? Check out http://goast.yuroyoro.net/\n\n### Roadmap\n\n#### Grammars\n  * better aspect grammar\n  * better pointcut grammar\n\n#### Parsing/Speed\n  * move from regexen to AST\n  * move from AST to IR\n\n#### Extending\n  * add support for 3rd party pkgs\n  * add support for stdlib\n\n#### Interface Pointcuts\n  * be able to define on interface fields\n  * be able to define on methods that satisfy interfaces\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeferpanic%2Fgoweave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeferpanic%2Fgoweave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeferpanic%2Fgoweave/lists"}