UUIDColumns patches from Chris Laco
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / UUIDColumns.pm
index efbe3d4..5df4ed8 100644 (file)
@@ -1,9 +1,9 @@
 package DBIx::Class::UUIDColumns;
 use base qw/DBIx::Class/;
 
-use Data::UUID;
-
 __PACKAGE__->mk_classdata( 'uuid_auto_columns' => [] );
+__PACKAGE__->mk_classdata( 'uuid_maker' );
+__PACKAGE__->uuid_class( __PACKAGE__->_find_uuid_module );
 
 =head1 NAME
 
@@ -11,7 +11,7 @@ DBIx::Class::UUIDColumns - Implicit uuid columns
 
 =head1 SYNOPSIS
 
-  pacakge Artist;
+  package Artist;
   __PACKAGE__->load_components(qw/UUIDColumns Core DB/);
   __PACKAGE__->uuid_columns( 'artist_id' );
 
@@ -37,6 +37,24 @@ sub uuid_columns {
     $self->uuid_auto_columns(\@_);
 }
 
+sub uuid_class {
+    my ($self, $class) = @_;
+
+    if ($class) {
+        $class = "DBIx::Class::UUIDMaker$class" if $class =~ /^::/;
+
+        if (!eval "require $class") {
+            $self->throw_exception("$class could not be loaded: $@");
+        } elsif (!$class->isa('DBIx::Class::UUIDMaker')) {
+            $self->throw_exception("$class is not a UUIDMaker subclass");
+        } else {
+            $self->uuid_maker($class->new);
+        };
+    };
+
+    return ref $self->uuid_maker;
+};
+
 sub insert {
     my $self = shift;
     for my $column (@{$self->uuid_auto_columns}) {
@@ -47,9 +65,30 @@ sub insert {
 }
 
 sub get_uuid {
-    return Data::UUID->new->to_string(Data::UUID->new->create),
+    return shift->uuid_maker->as_string;
 }
 
+sub _find_uuid_module {
+    if ($^O ne 'openbsd' && eval{require APR::UUID}) {
+        # APR::UUID on openbsd causes some as yet unfound nastyness for XS
+        return '::APR::UUID';
+    } elsif (eval{require UUID}) {
+        return '::UUID';
+    } elsif (eval{require Data::UUID}) {
+        return '::Data::UUID';
+    } elsif (eval{
+            # squelch the 'too late for INIT' warning in Win32::API::Type
+            local $^W = 0;
+            require Win32::Guidgen;
+        }) {
+        return '::Win32::Guidgen';
+    } elsif (eval{require Win32API::GUID}) {
+        return '::Win32API::GUID';
+    } else {
+        shift->throw_exception('no suitable uuid module could be found')
+    };
+};
+
 =head1 AUTHORS
 
 Chia-liang Kao <clkao@clkao.org>