Revision history for Perl extension Aspect

0.36 Wed 13 Jan 2010 - Adam Kennedy
	- WARNING: THIS RELEASE CONTAINS API CHANGES.
	  To retain compatibility with previous releases, you should change
	  all of your after() calls to after_returning() calls.
	- The after () advice now traps BOTH orginary return values and
	  exceptions, as per the AspectJ implementation.
	- To provide a more consistent naming of pointcuts (in preparation
	  for adding more of them) renamed the logical pointcut classes
	  to remove the "Op" part of the class name.
	- Bumped Test::Exception dependency to 0.29, since it has some
	  Sub::Uplevel fixes, and we use that heavily.

0.35 Mon 11 Jan 2010 - Adam Kennedy
	- Adding initial support for exceptions, with after_throwing

0.34 Sun 10 Jan 2010 - Adam Kennedy
	- Adding Aspect::Advice::AfterReturning before we implement exception
	  support in the main ::After advice.

0.33 Fri  8 Jan 2010 - Adam Kennedy
	- Added Test::NoWarnings to all of the tests
	- Refactoring advice testing into one test per advice type
	- Testing now covers more combinations of cases, including for around()
	- Fixed bug in return values for listwise before () calls
	- Calls to run_original for advice called in void context now
	  correctly runs the underlying hooked method in void context as well.
	- When called in after() or around() advice, proceed will throw an
	  exception.
	- Removed some of the author tests I don't care about as much.

0.32 Thu  7 Jan 2010 - Adam Kennedy
	- The actual term "forever" is meaningless. Reversed the flag to
	  be used as "lexical" instead.

0.31 Thu  7 Jan 2010 - Adam Kennedy
	- Removed the loading of Aspect::Library::Memoize and
	  Aspect::Library::TestClass in 01_compile.t which was causing
	  installation failure.

0.30 Thu  7 Jan 2010 - Adam Kennedy
	- Extended the forever currying support to the overall Aspect itself,
	  and upgraded the regular Library classes to implement it properly.
	- Renamed the term "forever" to a more simple "global" name.
	- Moved Aspect::Library::Memoize into a seperate distribution to
	  remove the Memoize dependency, which isn't 100% reliable.

0.29 Wed  6 Jan 2010 - Adam Kennedy
	- Added "forever currying" support. If advice is created in
	  void context we never add the $out_of_scope hook, and as a
	  result we don't need to save the advice object at all (and just
	  let it immediately destroy). As well as removing the need for a
	  bunch of the nasty curried objects, we remove an unnecesary if ()
	  test for every single call (to non-lexical hooks).

0.28 Wed  6 Jan 2010 - Adam Kennedy
	- Implemented Pointcut currying. The pointcut objects will
	  optimise themselves down to just the section that should run
	  if we assume the function was hooked correctly.
	  This not only makes the hooks much more efficient in working
	  out if they need to fire, but it also fixes a major bug with
	  negative call pointcuts always causing all functions to not fire.
	- Resolved RT #36527 - Minor doc bug s/Profiled/Profiler/
	- Moved Aspect::Library::Listenable into it's own distribution
	- Migrated all the tests from Test::Class to normal Test::More
	- Various code clean up and simplification, with less exporting
	- Added missing Task::Weaken dependency
	- Fixed, hopefully, the "variables will not remain shared" but
	  by moving from using pure named hook functions to assigning
	  anonymous subroutines to the typeglob instead.
	- Pointcuts now boolify (quickly) to true, and don't stringify to
	  a Data::Dumper debugging spew any more.
	- Implemted the internals needed to support AndOp and OrOp pointcuts
	  with more than 2 elements, so that in future long chained
	  collections of & or | pointcuts will collapse down into a single
	  object, instead of building as giant nested trees of boolean pairs.

0.27 Sun  3 Jan 2010 - Adam Kennedy
	- Various micro-optimisation of Aspect::AdviceContext which would
	  normally be somewhat pointless, but is useful in this case when
	  an Aspect hook is applied to something which is in the hot loop
	  for some program.
	- Added a test script to specifically hunt down the problems with
	  variable sharing in string-eval'ed closures.

0.26 Thu 31 Dec 2009 - Adam Kennedy
	- With the primary internals refactoring completely, we now start
	  a series of commits to remove excessive abstractions, and to alter
	  others to more appropriate abstractions (still without changing
	  any of the APIs)
	- Cleaning up and refactoring the Aspect/Advice constructor code in
	  Aspect.pm
	- Removed the weird Aspect::Advice->new( type, code, pointcut ) for
	  a more conventional ->new setup.
	- Attempt to load Sub::Uplevel earlier (before we load Exporter) so
	  there is an increased likelyhood that we don't have to reload
	  Exporter later.
	- Removed redundant references to Hook::LexWrap from the POD, and
	  removed the "Convert to Sub::Uplevel" item from the TO DO list.
	- Rewrote the Pointcut family of classes to have a simpler structure
	  which should be faster. Some now use blessed ARRAYs as a
	  preparatory step for allowing the AndOp/OrOp pointcuts to have
	  more than just two elements (and to allow enable certain
	  optimisation strategies down the line).
	- Removed the faulty Aspect::Pointcut::BinOp abstraction entirely.
	  It was causing boolean and/or operations to always run both sides,
	  so unlike the overloaded expression they were created from, they
	  would never shortcut. This is now resolved, and the an/or pointcut
	  elements now shortcut properly.

0.25 Thu 31 Dec 2009 - Adam Kennedy
	- Debundled various out-of-date testing libraries, and reverted
	  to more conventional build_requires dependencies now that our
	  downstream packaging systems have the ability to consume them.
	- Since the code documents the Aspect::Advice->install method as
	  private (and it is undocumented) rename to ->_install as a
	  precursor to changing it's behaviour at an API level.
	- Now that the descope execution of the closure hook is able to be
	  trusted, we no longer need the Aspect::Cleanup DESTROY-time
	  self-execution magick.
	- Added the ->wantarray property to the AdviceContext object.
	  This is provided as a convenience to the user (since the wantarray)
	  function works properly inside the advice code. It's main use is
	  for some AspectContext internals.
	- Added wantarray context test, which uncovered a bug where
	  void-context calls were incorrectly running the advice in scalar
	  context.

0.24 Wed 30 Dec 2009 - Adam Kennedy
	- Changes file now uses tabs (to make it less annoying for me) :)
	- Moved the inline Aspect::Hook::LexWrap::Cleanup class into it's
	  own dedicated Aspect::Cleanup class.
	- Merged Advice-specific hooks from Aspect::Hook::Lexwrap into the
	  advice classes.
	- Removed the now-redundant Aspect::Hook::Lexwrap entirely
	- Simplified the Aspect::AdviceContext constructor to make it faster
	- Logically merged the code-generated functionality from ->install
	  and the Hook::LexWrap-inspired ->hook methods for each Advice
	  class. This removes a lot of guess work and double handling from
	  the main execution path, and should be significantly faster.
	- With the code merged, pushed the scope exit flag outside the
	  symbol table iteration in the installer. Instead of a large array
	  of separate exit-tracking objects, we can instead use one single
	  shared lexical hook that works via mixed depth closure Magick.
	- Only call wantarray once per hook execution and share the result
	  therafter as a variable. Saves two function calls per hook.

0.23 Thu 24 Dec 2009 - Adam Kennedy
	- Removed the concept of a standalone Aspect::Weaver class
	- Each Aspect::Advice:: subclass now does most of the setup for the weaving
	  individually, with similar but slightly different implementations.
	  This adds some duplication of code, but removes a lot of architectural
	  complexity. It should make the creation of new types of Advice simpler.
	- Corrected the versions of the test libs (which went out of sync)
	- The Hook::LexWrap wrap function is now split into Advice-specific hooks
	  before and after, duplicating some code but making each type simpler and
	  faster.

0.22 Mon 21 Dec 2009 - Adam Kennedy
	- Part one of an upcoming series of major upgrades
	- Migrating to Sub::Uplevel to remove our custom CORE::GLOBAL::caller

0.21 Tue 21 Jul 2009 - Adam Kennedy
	- Bumped the version to 0.21 so the Hook::LexWrap module indexes

0.16 Tue 19 May 2009 - Adam Kennedy
	- Moved out Aspect::Library::Profiler into a standalone distribution

0.15 Thu Jul 24 23:02:11 CEST 2008 (Marcel Gruenauer <marcel@cpan.org>)
	- fixed version in all modules. *sigh*

0.14 Thu Jul 24 22:46:43 CEST 2008 (Marcel Gruenauer <marcel@cpan.org>)
	- fixed dist style

0.13 Thu Jul 24 18:22:15 CEST 2008 (Marcel Gruenauer <marcel@cpan.org>)
	- Made sure every module has a $VERSION
	- updated MANIFEST and MANIFEST.SKIP
	- removed META.yml as it is being generated by Module::Install
	- added requirements to Makefile.PL
	- converted Makefile.PL to use Module::Install
	- Aspect::Hook::LexWrap now uses warnings and strict; some changes were
	  necessary for those to go through
	- fixed POD error in Aspect::Modular
	- added spaces where necessary to avoid having the template's start_tag in
	  the code
	- renamed t/all_tests.t to t/01_all.t
	- added t/perlcriticrc
	- added .shipit
	- set version to 0.13
	- updated MANIFEST
	- updated t/perlcriticrc

0.12 Sat, 24 Mar 2007 00:00:00 +0100 (Ran Eilam <ran.eilam@gmail.com>)
	- You can now attach advice to subs in main:: package, see Advice tests
	- Made everything easier to install by including dependencies required for
	  testing
	- Added __always_fire option to Listenable
	- Listenable: You can now let listeners receive any parameters, not just
	  the event, see the test object_listener
	- Modified our hack on Hook::LexWrap so it does not ignore prototypes, see
	  Advice tests
	- Removed old warning from Makefile.PL

0.11 Tue, 03 Aug 2004 00:00:00 +0100 (Ran Eilam <ran.eilam@gmail.com>)
	- Fixed problem in upgrading from 0.08, CPAN.pm was getting confused on
	  Advice and Modular, because they had no version numbers, and undef is
	  smaller than 0.08. (merlyn)
	- Lowered dependency on Test::Class to 0.03

0.10 Fri, 30 Jul 2004 00:00:00 +0100 (Ran Eilam <ran.eilam@gmail.com>)
	- No longer a developer release
	- Added Listenable reusable aspect
	- Added subject_params() support for TestClass library aspect

0.09_03 Tue, 06 Jul 2004 00:00:00 +0100 (Ran Eilam <ran.eilam@gmail.com>)
	- Added Carp::Heavy to list of untouchables in Weaver.pm, to avoid Carp
	  dumping core
	- Test::Class aspect allows for customizing IUT through init_subject_state

0.09_02 Sat, 06 Mar 2004 00:00:00 +0100 (Ran Eilam <ran.eilam@gmail.com>)
	- AdviceContext now has the original code, so you can do AspectJ-style
	  around advice. You can call the original code from before or after
	  advice. Added AdviceContext::run_original.
	- Memoize can memoize in any context, not just scalar, again
	- Added Test::Class helper aspect
	- Started using Devel::Symdump

0.09_01 Sat, 06 Mar 2004 00:00:00 +0100 (Ran Eilam <ran.eilam@gmail.com>)
	- Released for review by participants in YAPC::Israel 2004
	- New syntax is incompatible with old
	- New maintainer, Ran Eilam
	- Control flow pointcut: cflow(), done according to Marcel's design
	- Advice context trapping for control flow pointcuts
	- Use Test::Class for unit tests
	- Wormhole reusable aspect
	- Added prototypes so you can dispense with parentheses
	- Removed return/around pointcuts, added after advice
	- Removed attribute interface
	- Added a mutated version of Hook::LexWrap with support for
	  appending/removing arguments
	- Moved reusable aspects to Aspect::Library
	- regression: Aspect exported subs generate join points again

0.07 Wed, 31 Jul 2002 22:42:27 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- The distribution has been adapted for use with perl5.8.0.
	  C<Hook::LexWrap> is now a core module, but there was a problem with
	  context (wantarray) handling with Aspect::Memoize. Sorry about the perl
	  5.6.x users, but this is bleeding-edge stuff, so you're expected to use
	  the very latest gear. Anyway, you can still get an earlier version (up
	  to 0.07) from CPAN, which will work with perl 5.6.x.
	- Aspect::Memoize is now intended for subroutines returning scalars only.
	  That is, if the sub is called in list context, it will still only
	  memoize, and return, a memoized scalar. Void context obviously doesn't
	  matter when it comes to memoization; subroutines returning lists are
	  something I have to think about.
	- Tests now use Test::More

0.07 Fri, 15 Mar 2002 09:04:51 +0100 (Marcel Gruenauer <marcel@cpan.org>)
	- symbols exported from Aspect.pm now don't generate join points. So I
	  added Aspect::import() and modified Aspect::JoinPoint::enum() to check
	  for %Aspect::exp_syms.

0.06 Fri, 26 Oct 2001 16:42:51 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- added around() function to Aspect.pm
	- added Aspect::Profiled
	- added Aspect::Attribute interface to creating advice
	- made Aspect::Advice's enable() and disable() return $self
	- added cookbook example program callflow_attr.pl
	- added cookbook recipes for bounds checking and change tracking, plus
	  sample programs

0.05 Thu, 11 Oct 2001 09:44:50 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- removed dependency on Data::Denter

0.04 Mon, 01 Oct 2001 18:33:00 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- removed the patched Hook::LexWrap now that 0.20 is out which fixes all
	  the problems of 0.10
	- added documentation (a recurring theme, never finishes)

0.03 Sun, 30 Sep 2001 19:43:56 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- added documentation
	- Included a patched Hook::LexWrap that fixes a bug with wantarray
	  preservation in subroutine wrappers. Will be removed if and when Damian
	  approves of the patch or otherwise fixes the bug.

0.02 Fri, 28 Sep 2001 12:59:06 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- added documentation
	- added '$::thisjp' global variable
	- added modular memoization aspect: Aspect::Memoize
	- added modular tracing aspect: Aspect::Trace

0.01 Fri, 28 Sep 2001 10:36:08 +0200 (Marcel Gruenauer <marcel@cpan.org>)
	- original version