import 0.001
[gitmo/MooseX-InsideOut.git] / lib / MooseX / InsideOut / Meta / Class.pm
diff --git a/lib/MooseX/InsideOut/Meta/Class.pm b/lib/MooseX/InsideOut/Meta/Class.pm
new file mode 100644 (file)
index 0000000..e5984d3
--- /dev/null
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+
+package MooseX::InsideOut::Meta::Class;
+
+# need to load this before loading Moose and using it as a metaclass, because
+# of circularity
+use MooseX::InsideOut::Meta::Instance;
+use Moose;
+extends 'Moose::Meta::Class';
+
+sub initialize {
+  my $class = shift;
+  my $pkg   = shift;
+  $class->SUPER::initialize(
+    $pkg,
+    instance_metaclass => 'MooseX::InsideOut::Meta::Instance',
+    @_,
+  );
+}
+
+# this seems like it should be part of Moose::Meta::Class
+sub construct_instance {
+  my ($class, %params) = @_;
+  my $meta_instance = $class->get_meta_instance;
+  my $instance      = $params{'__INSTANCE__'}
+    || $meta_instance->create_instance();
+  foreach my $attr ($class->compute_all_applicable_attributes()) {
+    my $meta_instance = $attr->associated_class->get_meta_instance;
+    $attr->initialize_instance_slot($meta_instance, $instance, \%params);
+  }
+  return $instance;
+}
+
+1;