diff --git a/lib/pardot/client.rb b/lib/pardot/client.rb
index 914dbff..63ee5e4 100644
--- a/lib/pardot/client.rb
+++ b/lib/pardot/client.rb
@@ -9,6 +9,8 @@ class Client
include Authentication
include Http
+ include Objects::Accounts
+ include Objects::Campaigns
include Objects::Emails
include Objects::Lists
include Objects::ListMemberships
diff --git a/lib/pardot/objects/accounts.rb b/lib/pardot/objects/accounts.rb
new file mode 100644
index 0000000..454e19e
--- /dev/null
+++ b/lib/pardot/objects/accounts.rb
@@ -0,0 +1,32 @@
+module Pardot
+ module Objects
+ module Accounts
+ def accounts
+ @accounts ||= Accounts.new self
+ end
+
+ class Accounts
+
+ def initialize client
+ @client = client
+ end
+
+ def read params = {}
+ get "/do/read", params
+ end
+
+ protected
+
+ def get path, params = {}, result = "account"
+ response = @client.get "account", path, params
+ result ? response[result]: response
+ end
+
+ def post path, params = {}, result = "account"
+ response = @client.post "account", path, params
+ result ? response[result] : response
+ end
+ end
+ end
+ end
+end
diff --git a/lib/pardot/objects/campaigns.rb b/lib/pardot/objects/campaigns.rb
new file mode 100644
index 0000000..3acd72c
--- /dev/null
+++ b/lib/pardot/objects/campaigns.rb
@@ -0,0 +1,50 @@
+module Pardot
+ module Objects
+ module Campaigns
+ def campaigns
+ @campaigns ||= Campaigns.new self
+ end
+
+ class Campaigns
+
+ def initialize(client)
+ @client = client
+ end
+
+ def query(search_criteria)
+ result = get('/do/query', search_criteria, 'result')
+ result['total_results'] = result['total_results'].to_i if result['total_results']
+ result
+ end
+
+ def create(params={})
+ post('/do/create', params)
+ end
+
+ # read_by_id
+ # update_by_id
+ [:read, :update].each do |verb|
+ define_method(verb) do |id, params ={}|
+ post(api_url(verb, 'id', id), params)
+ end
+ end
+
+ private
+
+ def api_url(verb, direct_to, value)
+ "/do/#{verb}/#{direct_to}/#{value}"
+ end
+
+ def get(path, params={}, result='campaign')
+ response = @client.get('campaign', path, params)
+ result ? response[result] : response
+ end
+
+ def post(path, params={}, result='campaign')
+ response = @client.post('campaign', path, params)
+ result ? response[result] : response
+ end
+ end
+ end
+ end
+end
diff --git a/lib/ruby-pardot.rb b/lib/ruby-pardot.rb
index cb44ecb..9682e33 100644
--- a/lib/ruby-pardot.rb
+++ b/lib/ruby-pardot.rb
@@ -6,6 +6,8 @@
require 'pardot/error'
require 'pardot/authentication'
+require 'pardot/objects/accounts'
+require 'pardot/objects/campaigns'
require 'pardot/objects/emails'
require 'pardot/objects/lists'
require 'pardot/objects/list_memberships'
diff --git a/spec/pardot/objects/accounts_spec.rb b/spec/pardot/objects/accounts_spec.rb
new file mode 100644
index 0000000..084ef85
--- /dev/null
+++ b/spec/pardot/objects/accounts_spec.rb
@@ -0,0 +1,29 @@
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
+
+describe Pardot::Objects::Accounts do
+ before do
+ @client = create_client
+ end
+
+ describe "read" do
+
+ def sample_results
+ %(\n
+
+ 123
+ Test Company
+
+ )
+ end
+
+ before do
+ @client = create_client
+ end
+
+ it "should read the account" do
+ fake_get "/api/account/version/3/do/read?user_key=bar&api_key=my_api_key&format=simple", sample_results
+
+ @client.accounts.read.should == {"id" => "123", "company" => "Test Company"}
+ end
+ end
+end
diff --git a/spec/pardot/objects/campaigns_spec.rb b/spec/pardot/objects/campaigns_spec.rb
new file mode 100644
index 0000000..a66ccba
--- /dev/null
+++ b/spec/pardot/objects/campaigns_spec.rb
@@ -0,0 +1,111 @@
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
+
+describe Pardot::Objects::Campaigns do
+ before do
+ @client = create_client
+ end
+
+ describe "query" do
+
+ def sample_results
+ %(\n
+
+ 2
+
+ 123
+ First Campaign
+ 5
+
+
+ 321
+ Second Campaign
+ 0
+
+
+ )
+ end
+
+ before do
+ @client = create_client
+ end
+
+ it "should query the campaigns" do
+ fake_get "/api/campaign/version/3/do/query?id_less_than=555&user_key=bar&api_key=my_api_key&format=simple", sample_results
+
+ @client.campaigns.query({"id_less_than" => "555"}).should == {"total_results"=>2,
+ "campaign"=>[
+ {"id"=>"123", "name"=>"First Campaign", "cost"=>"5"},
+ {"id"=>"321", "name"=>"Second Campaign", "cost"=>"0"}
+ ]}
+ end
+ end
+
+ describe "create" do
+
+ def sample_results
+ %(\n
+
+ 123
+ New Campaign
+ 5
+
+ )
+ end
+
+ before do
+ @client = create_client
+ end
+
+ it "should create the campaign" do
+ fake_post "/api/campaign/version/3/do/create?name=New%20Campaign&cost=5&user_key=bar&api_key=my_api_key&format=simple", sample_results
+
+ @client.campaigns.create({"name" => "New Campaign", "cost" => "5"}).should == {"id" => "123", "name" => "New Campaign", "cost" => "5"}
+ end
+ end
+
+ describe "read" do
+
+ def sample_results
+ %(\n
+
+ 123
+ Test Campaign
+ 0
+
+ )
+ end
+
+ before do
+ @client = create_client
+ end
+
+ it "should read the campaign by id" do
+ fake_post "/api/campaign/version/3/do/read/id/123?user_key=bar&api_key=my_api_key&format=simple", sample_results
+
+ @client.campaigns.read(123).should == {"id" => "123", "name" => "Test Campaign", "cost" => "0"}
+ end
+ end
+
+ describe "update" do
+
+ def sample_results
+ %(\n
+
+ 123
+ Test Campaign Updated
+ 0
+
+ )
+ end
+
+ before do
+ @client = create_client
+ end
+
+ it "should update the campaign by id" do
+ fake_post "/api/campaign/version/3/do/update/id/123?name=Test%20Campaign%20Updated&user_key=bar&api_key=my_api_key&format=simple", sample_results
+
+ @client.campaigns.update(123, {"name" => "Test Campaign Updated"}).should == {"id" => "123", "name" => "Test Campaign Updated", "cost" => "0"}
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 9300773..0df7031 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -6,6 +6,7 @@
require 'crack'
require 'httparty'
-require 'ruby-pardot'
-
+Dir["#{File.dirname(__FILE__)}/../lib/pardot/objects/**/*.rb"].each { |f| require f }
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
+
+require 'ruby-pardot'