Index: lang/perl/Shika/trunk/t/030_method-modifiers/01_before_simple.t
===================================================================
--- lang/perl/Shika/trunk/t/030_method-modifiers/01_before_simple.t (revision 25141)
+++ lang/perl/Shika/trunk/t/030_method-modifiers/01_before_simple.t (revision 25141)
@@ -0,0 +1,23 @@
+use strict;
+use warnings;
+use Test::More tests => 4;
+
+my $i = 0;
+{
+    package Foo;
+    use Shika;
+
+    sub bar {
+        main::is $i++, 1;
+        'ok';
+    }
+
+    before bar => sub {
+        main::is $_[1], 1;
+        main::is $i++, 0;
+    };
+
+}
+
+my $f = Foo->new;
+is $f->bar(1), 'ok';
Index: lang/perl/Shika/trunk/t/030_method-modifiers/02_after_simple.t
===================================================================
--- lang/perl/Shika/trunk/t/030_method-modifiers/02_after_simple.t (revision 25141)
+++ lang/perl/Shika/trunk/t/030_method-modifiers/02_after_simple.t (revision 25141)
@@ -0,0 +1,23 @@
+use strict;
+use warnings;
+use Test::More tests => 4;
+
+my $i = 0;
+{
+    package Foo;
+    use Shika;
+
+    sub bar {
+        main::is $i++, 0;
+        'ok';
+    }
+
+    after bar => sub {
+        main::is $_[1], 1;
+        main::is $i++, 1;
+    };
+
+}
+
+my $f = Foo->new;
+is $f->bar(1), 'ok';
Index: lang/perl/Shika/trunk/lib/Shika.pm
===================================================================
--- lang/perl/Shika/trunk/lib/Shika.pm (revision 25139)
+++ lang/perl/Shika/trunk/lib/Shika.pm (revision 25141)
@@ -25,7 +25,10 @@
         has      => {},
         default  => {},
+        modifier => {},
     };
 
     no strict 'refs';
+    *{"$pkg\::before"}  = \&_before;
+    *{"$pkg\::after"}   = \&_after;
     *{"$pkg\::meta"}    = sub { $meta };
 }
@@ -240,4 +243,87 @@
 }
 
+sub _install_modifier {
+    my($pkg, $name) = @_;
+    my $modifier = _init_modifier($pkg, $name);
+    my $before = $modifier->{before};
+    my $after  = $modifier->{after};
+    my $around = $modifier->{around};
+
+    if (@$before && @$after) {
+        $modifier->{cache} = sub {
+            $_->(@_) for @{$before};
+            my @rval;
+            ((defined wantarray) ?
+                ((wantarray) ?
+                    (@rval = $modifier->{around_cache}->(@_))
+                    :  
+                    ($rval[0] = $modifier->{around_cache}->(@_)))
+                :  
+                $modifier->{around_cache}->(@_));
+            $_->(@_) for @{$after};
+            return unless defined wantarray;
+            return wantarray ? @rval : $rval[0];
+        }
+    } elsif (@$before && !@$after) {
+        $modifier->{cache} = sub {
+            $_->(@_) for @{$before};
+            return $modifier->{around_cache}->(@_);
+        }
+    } elsif (@$after && !@$before) {
+        $modifier->{cache} = sub {
+            my @rval;
+            ((defined wantarray) ?
+                ((wantarray) ?
+                    (@rval = $modifier->{around_cache}->(@_))
+                    :  
+                    ($rval[0] = $modifier->{around_cache}->(@_)))
+                :  
+                $modifier->{around_cache}->(@_));
+            $_->(@_) for @{$after};
+            return unless defined wantarray;
+            return wantarray ? @rval : $rval[0];
+        }
+    } else {
+        $modifier->{cache} = $modifier->{around_cache};
+    }
+
+    no strict 'refs';
+    no warnings 'redefine';
+    *{"$pkg\::$name"} = sub { goto $modifier->{cache} };
+}
+
+sub _init_modifier {
+    my($pkg, $name) = @_;
+    die "The method '$name' is not found in the inheritance hierarchy for class $pkg"
+        unless $pkg->can($name);
+    my $code = $pkg->can($name);
+    $pkg->meta->{modifier}->{$name} ||= +{
+        around_cache => $code,
+        cache        => $code,
+        orig         => $code,
+        around       => [],
+        before       => [],
+        after        => [],
+    };
+}
+
+sub _before {
+    my $pkg = caller(0);
+    my $name = shift;
+    my $modifier = _init_modifier($pkg, $name);
+    unshift @{ $modifier->{before} }, $_[0];
+    _install_modifier($pkg, $name);
+}
+
+sub _after {
+    my $pkg = caller(0);
+    my $name = shift;
+    my $modifier = _init_modifier($pkg, $name);
+    push @{ $modifier->{after} }, $_[0];
+    _install_modifier($pkg, $name);
+}
+
+# utils
+
 sub _load_class {
     my $role = shift;
