package TB2::HasObjectID;

require TB2::Mouse;
use TB2::Mouse::Role;

our $VERSION = '1.005000_004';
$VERSION = eval $VERSION;    ## no critic (BuiltinFunctions::ProhibitStringyEval)


=head1 NAME

TB2::HasObjectID - a unique id in the current process

=head1 SYNOPSIS

    package My::Thing;

    use TB2::Mouse;
    with "TB2::HasObjectID";

    my $thing = My::Thing->new;
    my $id = $thing->object_id;

=head1 DESCRIPTION

Provides a method for generating unique ids for many TB2 objects.

Useful if, for example, an EventHandler posts its own events and
doesn't want to process them twice.

=head3 object_id

    my $id = $thing->object_id;

Returns an identifier for this object unique to the running process.
The identifier is fairly simple and easily predictable.

=cut

my $Counter = int rand(1_000_000);
has object_id =>
  is            => 'ro',
  isa           => 'Str',
  lazy          => 1,
  default       => sub {
      my $self = shift;

      # Include the class in case somebody else decides to use
      # just an integer.
      return ref($self) . '-' . $Counter++;
  }
;

no TB2::Mouse;
no TB2::Mouse::Role;

1;
