Group
Extension

Padre-Plugin-Swarm/lib/Padre/Swarm/Geometry.pm

package Padre::Swarm::Geometry;

use strict;
use warnings;
use Params::Util qw( _INSTANCE );
use Padre::Logger;
use Graph;
use Graph::Directed;
use Class::XSAccessor 
    accessors => {
	graph => 'graph',
    };
our $VERSION = '0.2';

=pod

=head1 NAME

Padre::Swarm::Geometry - represent connectedness between points

=head1 DESCRIPTION

Vaporware. 

=head2 TODO

Swarm geometry should be very flexible and fetchable incrementally, a geometry
walker may find a reference to more geometry that is unknown to it, 
later if that geometry arrives in the swarm it may be connected to any 
existing swarm geometries that refer to it.

=cut

sub new {
	my $class = shift;
	my %args = @_;
	$args{graph} ||= new Graph::Directed
	    unless _INSTANCE( $args{graph}, 'Graph::Directed' );
	
	return bless \%args, ref($class) || $class;
}

sub plugin {
    return Padre::Plugin::Swarm->instance;
}

sub get_users {
	my $self = shift;
	my @users = $self->graph->successors('~identity');
	return @users;
}


sub enable {}
sub disable {}

sub on_recv {
    my ($self,$message) = @_;
    my $handler = 'accept_'  . $message->type;
    TRACE( "Geometry recv $handler" ) if DEBUG;
    if ( $self->can($handler) ) {
		TRACE( "Geometry handler $handler" ) if DEBUG;
		eval { $self->$handler($message) } ;
		if ( $@ ) {
			TRACE( "Geometry handler error - $@" );
		}
    } else {
		TRACE( "Ignored " . $message->type ) if DEBUG;
		
	}
}

sub accept_promote {
	my $self = shift;
	my $message = shift;
	$self->graph->add_edge( '~service' => $message->{service} );
	$self->graph->add_edge( '~identity' => $message->{from} );

	if ($message->{resource}) {
		$self->graph->add_edge( 
			$message->{from} , 
			$message->{resource} );
	}
	

}

sub accept_destroy {
	my $self = shift;
	my $message = shift;
	return unless $message->{resource};
	
	$self->graph->delete_edge( $message->{from} ,
		$message->{resource}
	);
		
	$self->graph->delete_edge( $message->{resource} ,
		$message->{service}
	);
	
}


sub accept_disco {
	my $self = shift;
	my $message = shift;
	my $g = $self->graph;
	# TODO - if this disco is targeted to us do something interesting
}

sub accept_announce {
	my $self = shift;
	my $message = shift;
	$self->graph->add_edge( '~identity' => $message->{from} );
	if ( exists $message->{resource} ) {
		$self->graph->add_edge( 
		    $message->{from} ,
		    $message->{resource},
		)
	}
	
}

sub accept_leave {
	my $self = shift;
	my $message = shift;
	my @s = $self->graph->successors( $message->{from} );
	$self->graph->delete_vertex( $_ )
	    for @s, $message->{from};
	
	
}


sub TO_JSON {
	
}

sub FROM_JSON {
	
}

1;


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.