{"adoption": {"forks": 1266, "observed_at": "2026-08-28T04:10:21.100377+00:00", "stars": 8422}, "canonical_url": "https://ross.abutalabs.com/products/aspects", "card": {"archived": true, "artifact_type": "library", "description": "Delightful, simple library for aspect oriented programming in Objective-C and Swift.", "domain": ["developer-tools", "mobile-development", "apple-ecosystem"], "enriched": true, "function": ["middleware", "developer-tools", "testing", "mocking"], "health_score": 10, "homepage": "https://twitter.com/steipete", "language": "Objective-C", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["steipete/Aspects"], "name": "steipete/Aspects", "platform": ["cpp"], "pushed_at": "2025-11-25T13:09:18+00:00", "repo": "steipete/Aspects", "stars": 8422, "tags": ["aspect-oriented-programming", "method-swizzling", "objective-c", "aop", "hooks", "runtime", "ios", "macos", "swift"], "topics": ["objectivec", "aspects", "objective-c", "hooks", "swift"], "urls": [], "use_cases": ["add logging or analytics to existing iOS methods without subclassing", "mock parts of a method in tests", "hook into view controller lifecycle methods", "patch third-party framework behavior at runtime", "quickly prototype behavior changes via method hooks"], "what_it_is": "Aspects is a small Objective-C/Swift library for aspect-oriented programming that hooks into existing methods per class or per instance using message forwarding and dynamic subclasses. It is essentially method swizzling made easy, with before/instead/after insertion points and thread-safe token-based deregistration.", "when_to_avoid": ["the author explicitly does not recommend it for production code", "you need to hook methods called at high frequency (message forwarding overhead)", "you need to hook static methods", "your codebase relies heavily on message forwarding, which conflicts with _objc_msgForward"], "when_to_choose": ["you need lightweight AOP or method swizzling in Objective-C/Swift", "you want per-instance or per-class method hooks with before/instead/after options", "you need partial test mocks in an iOS codebase", "you're hacking on a prototype and need quick runtime hooks"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/aspects", "repo": "steipete/Aspects", "role": "main", "score": 10}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:10:21.100377+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:27:16.594558+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a2a91f2d19956b32c851f52f089c280a0d5b7200842753a07f2b9cfa0032fe00", "fetched_at": "2026-08-28T04:10:21.100377+00:00", "kind": "readme", "missing": false, "url": "https://github.com/steipete/Aspects"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 54, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["archived"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4505, "days_push": 281, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 10, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}